/**
 * @file common_defs.h
 * @brief 系统通用定义与宏
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef COMMON_DEFS_H
#define COMMON_DEFS_H

#include <stdint.h>   // 包含标准整数类型
#include <stddef.h>   // 包含size_t定义
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// 版本信息
#define ICE_MONITOR_VERSION     "1.0.0"
#define ICE_MONITOR_BUILD_DATE  __DATE__
#define ICE_MONITOR_BUILD_TIME  __TIME__

// 常量定义
#define MAX_PATH_LENGTH        256
#define MAX_URL_LENGTH         256
#define MAX_STRING_LENGTH      128
#define DEFAULT_TIMEOUT_MS     5000
#define DEFAULT_RETRY_COUNT    3
#define DEFAULT_SAMPLING_INTERVAL 1000  // 默认采样间隔 1000ms
#define DEFAULT_LOG_LEVEL      2        // 默认日志级别 INFO
#define DEFAULT_DEBUG_MODE     false

// 数据有效性
#define DATA_VALID             1
#define DATA_INVALID           0

// 风险等级定义
typedef enum {
    RISK_LEVEL_NONE = 0,    // 无风险
    RISK_LEVEL_LOW,         // 低风险
    RISK_LEVEL_MEDIUM,      // 中等风险
    RISK_LEVEL_HIGH,        // 高风险
    RISK_LEVEL_EXTREME      // 极端风险
} RiskLevel;

// 系统运行模式
typedef enum {
    RUN_MODE_EXIT = 0,           // 退出
    RUN_MODE_SENSOR_ONLY,        // 仅传感器模式
    RUN_MODE_SENSOR_VISUAL,      // 传感器+视觉摄像头模式
    RUN_MODE_STEREO_CAMERA,      // 传感器+双目摄像头模式
    RUN_MODE_FULL_SYSTEM,        // 完整系统功能
    RUN_MODE_SIMULATION,         // 纯模拟模式
    RUN_MODE_HELP,               // 帮助信息
    RUN_MODE_HYBRID,             // 混合模式，同时使用模拟数据和三摄像头
    RUN_MODE_MOCK_CAMERA_DEBUG,  // 模拟数据+摄像头调试模式（不计算覆冰厚度，只显示和存储图像）
    RUN_MODE_MOCK_400W_FUSION,   // 模拟数据+400W摄像头+数据融合（计算等值线缆覆冰厚度）
    RUN_MODE_MOCK_800W_FUSION,   // 模拟数据+双800W摄像头+数据融合（计算真实线缆覆冰厚度）
    RUN_MODE_CAMERA_CAPTURE,     // 摄像头捕获模式（同步时间并连续获取图像）
    RUN_MODE_TRIPLE_CAMERA = 10  // 三摄像头模式（从外部三个摄像头获取图像）
} RunMode;

// 采样模式
typedef enum {
    SAMPLE_MODE_REAL = 0,    // 实时模式
    SAMPLE_MODE_SIMULATION,  // 模拟模式
    SAMPLE_MODE_REPLAY       // 回放模式
} SampleMode;

// 日志级别
typedef enum {
    LOG_LEVEL_NONE = 0,     // 不记录日志
    LOG_LEVEL_ERROR,        // 只记录错误
    LOG_LEVEL_WARNING,      // 记录警告和错误
    LOG_LEVEL_INFO,         // 记录信息、警告和错误
    LOG_LEVEL_DEBUG,        // 记录调试信息、普通信息、警告和错误
    LOG_LEVEL_TRACE         // 记录所有内容，包括跟踪信息
} LogLevel;

// 传感器数据结构
typedef struct {
    float temperature;      // 温度 (°C)
    float humidity;         // 湿度 (%)
    float wind_speed;       // 风速 (m/s)
    float wind_direction;   // 风向 (°)
    float tension1;         // 拉力1 (N)
    float tension2;         // 拉力2 (N)
    float battery_level;    // 电池电量 (%)
    float voltage;          // 电压 (V)
    int signal_strength;    // 信号强度 (dBm)
    uint64_t timestamp;     // 时间戳 (ms)
} SensorData;

// 数据融合结构
typedef struct {
    // 各种来源的数据
    float visual_thickness;  // 视觉测量冰厚度 (mm)
    float stereo_thickness;  // 立体视觉测量冰厚度 (mm)
    float sensor_tension;    // 传感器测量拉力 (N)
    float calc_tension;      // 计算得到的拉力 (N)
    
    // 环境数据
    float temperature;       // 温度 (°C)
    float humidity;          // 湿度 (%)
    float wind_speed;        // 风速 (m/s)
    float wind_direction;    // 风向 (°)
    
    // 修正系数
    float temperature_correction; // 温度修正系数
    float wind_correction;        // 风对覆冰厚度的修正系数
    float tension_wind_correction; // 风对拉力测量的修正系数
    
    // 计算结果
    float ice_density;       // 冰密度 (kg/m³)
    float adjusted_ice_density; // 修正后的冰密度 (kg/m³)
    float ice_volume;        // 冰体积 (mm³/mm)
    float ice_weight;        // 冰重量 (kg/m)
    RiskLevel risk_level;    // 风险等级
    
    // 元数据
    uint64_t timestamp;      // 时间戳 (ms)
    int data_valid;          // 数据是否有效
} FusionData;

#ifdef __cplusplus
}
#endif

#endif /* COMMON_DEFS_H */ 